package com.maint.m.utils

import android.util.Log

/**
 * 操作项缓存使用示例
 * 这个类展示了如何使用AppDataManager中的操作项缓存功能
 */
object OperationCacheExample {

    private const val TAG = "OperationCacheExample"
    
    // 缓存键的常量定义
    const val KEY_SELECTED_TICKET = "selected_ticket"
    const val KEY_OPERATION_HISTORY = "operation_history"
    const val KEY_CURRENT_PROCESS = "current_process"
    
    /**
     * 示例：保存一个操作项
     */
    fun saveExample() {
        // 保存一个字符串
        AppDataManager.saveOperation(KEY_SELECTED_TICKET, "工单-20230516-001")
        Log.d(TAG, "已保存工单信息到缓存")
        
        // 保存一个整数
        AppDataManager.saveOperation("step_count", 5)
        Log.d(TAG, "已保存步骤计数到缓存")
        
        // 保存一个自定义对象（需要实现Serializable接口）
        val processInfo = ProcessInfo("设备检测", 1001, true)
        AppDataManager.saveOperation(KEY_CURRENT_PROCESS, processInfo)
        Log.d(TAG, "已保存当前处理信息到缓存")
        
        // 保存一个列表
        val historyList = listOf("打开设备", "检查状态", "读取参数")
        AppDataManager.saveOperation(KEY_OPERATION_HISTORY, historyList as java.io.Serializable)
        Log.d(TAG, "已保存操作历史到缓存")
    }
    
    /**
     * 示例：获取一个操作项
     */
    fun getExample() {
        // 获取字符串类型的缓存
        val ticketId = AppDataManager.getOperation<java.io.Serializable>(KEY_SELECTED_TICKET) as? String
        if (ticketId != null) {
            Log.d(TAG, "从缓存获取到工单ID: $ticketId")
        } else {
            Log.d(TAG, "工单ID缓存不存在")
        }
        
        // 获取整数类型的缓存
        val stepCount = AppDataManager.getOperation<java.io.Serializable>("step_count") as? Int
        if (stepCount != null) {
            Log.d(TAG, "从缓存获取到步骤计数: $stepCount")
        }
        
        // 获取自定义对象类型的缓存
        val processInfo = AppDataManager.getOperation<java.io.Serializable>(KEY_CURRENT_PROCESS) as? ProcessInfo
        if (processInfo != null) {
            Log.d(TAG, "从缓存获取到处理信息: ${processInfo.name}, ID: ${processInfo.id}, 状态: ${processInfo.isActive}")
        }
        
        // 获取列表类型的缓存
        val serializableHistory = AppDataManager.getOperation<java.io.Serializable>(KEY_OPERATION_HISTORY)
        val historyList = if (serializableHistory is List<*>) {
            @Suppress("UNCHECKED_CAST")
            (serializableHistory as List<String>).filterIsInstance<String>()
        } else {
            null
        }
        if (historyList != null) {
            Log.d(TAG, "从缓存获取到操作历史: $historyList")
        }
    }
    
    /**
     * 示例：检查和移除操作项
     */
    fun checkAndRemoveExample() {
        // 检查缓存是否存在
        if (AppDataManager.hasOperation(KEY_SELECTED_TICKET)) {
            Log.d(TAG, "工单ID缓存存在")
            
            // 移除特定缓存
            AppDataManager.removeOperation(KEY_SELECTED_TICKET)
            Log.d(TAG, "已移除工单ID缓存")
        } else {
            Log.d(TAG, "工单ID缓存不存在")
        }
        
        // 清空所有操作项缓存
        // 注意：这会清除所有操作项缓存，谨慎使用
        // AppDataManager.clearOperations()
        // Log.d(TAG, "已清空所有操作项缓存")
        
        // 清空应用所有数据（包括连接状态、设备信息等）
        // 注意：这会清除应用的所有全局数据，谨慎使用
        // AppDataManager.clearAll()
    }
    
    /**
     * 示例：在Activity或Fragment中使用
     * 这个方法演示了在实际场景中的使用方式
     */
    fun useInActivityExample() {
        // 在一个Activity中保存用户当前的操作状态
        // 例如：当用户离开当前页面时保存状态
        // fun onPause() {
        //     AppDataManager.saveOperation("current_page_state", "正在处理步骤3")
        // }
        
        // 当用户返回页面时恢复状态
        // fun onResume() {
        //     val savedState: String? = AppDataManager.getOperation("current_page_state")
        //     savedState?.let {
        //         // 恢复UI状态
        //     }
        // }
    }
}

/**
 * 示例自定义类，需要实现Serializable接口才能被缓存
 */
data class ProcessInfo(val name: String, val id: Int, val isActive: Boolean) : java.io.Serializable